﻿using System;
using System.Collections.Generic;
using System.Data.Objects;
using System.Linq;
using System.Text;
using SOM.AbstractDAL;
using SOM.Model;
using SOM.SingletonContext;

namespace SOM.ConcreteDAL
{
    public class InstituicaoDAL : AbstractInstituicaoDAL
    {
        private SOMEntities _contexto;

        public InstituicaoDAL()
        {
            _contexto = new SOMEntities();
        }

        /// <summary>
        /// Retorna todas as instituições cadastradas
        /// </summary>
        /// <returns></returns>
        public override List<Instituicao> FindAll()
        {
            return _contexto.InstituicoesSet.ToList();
        }


        /// <summary>
        /// Insere uma instituição
        /// </summary>
        /// <param name="instituicao"></param>
        public override void Insert(Instituicao instituicao)
        {
            _contexto.AddToInstituicoesSet(instituicao);

            _contexto.SaveChanges();
        }

        /// <summary>
        /// Atualiza uma instituição
        /// </summary>
        /// <param name="instituicao"></param>
        public override void Update(Instituicao instituicao)
        {
            _contexto.Refresh(RefreshMode.StoreWins, instituicao);
        }

        /// <summary>
        /// Exclui uma instituição
        /// </summary>
        /// <param name="instituicao"></param>
        public override void Delete(Instituicao instituicao)
        {
            _contexto.DeleteObject(instituicao);

            _contexto.SaveChanges();
        }

        /// <summary>
        /// Retorna uma instituição pelo seu ID
        /// </summary>
        /// <param name="idInstituicao"></param>
        /// <returns></returns>
        public override Instituicao FindById(int idInstituicao)
        {

            var consulta = from i in _contexto.InstituicoesSet
                           where i.ins_id_instituicao.Equals(idInstituicao)
                           select i;

            return consulta.Count() == 0 ? null : consulta.First();
        }

        /// <summary>
        /// Procura uma instituição através do cnpj.
        /// </summary>
        /// <param name="cnpj"></param>
        /// <returns></returns>
        public override Instituicao FindByCnpj(string cnpj)
        {
            using (SOMEntities contexto = new SOMEntities())
            {
                var consulta = from ins in contexto.InstituicoesSet
                               where ins.ins_nu_cnpj.Equals(cnpj)
                               select ins;

                return consulta.Count() == 0 ? null : consulta.First();
            }
        }

        /// <summary>
        /// Carrega uma instituição num contexto.
        /// </summary>
        /// <param name="idInstituicao"></param>
        /// <param name="contexto"></param>
        /// <returns></returns>
        public override Instituicao Load(int idInstituicao, SOMEntities contexto)
        {
            var consulta = from ins in contexto.InstituicoesSet.Include("end_endereco")
                           where ins.ins_id_instituicao.Equals(idInstituicao)
                           select ins;
            return consulta.Count() == 0 ? null : consulta.First();
        }

       /// <summary>
       /// Carrega uma instituição e suas dependências.
       /// </summary>
       /// <param name="idInstituicao"></param>
       /// <returns></returns>
        public override Instituicao Load(int idInstituicao)
        {
            using(SOMEntities contexto = new SOMEntities())
            {
                var consulta = from ins in contexto.InstituicoesSet.Include("end_endereco")
                               where ins.ins_id_instituicao.Equals(idInstituicao)
                               select ins;
                return consulta.Count() == 0 ? null : consulta.First();
            }
        }

        /// <summary>
        /// Salva o contexto.
        /// </summary>
        public override void SaveChanges()
        {
            _contexto.SaveChanges();
        }
    }
}
